#include "drv_sg90.h"


void TIM3_SG90_PWM_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

	//连接复用功能
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM3);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM3);
	GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3);
	GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3);

	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	//计数频率 = 84MHz ÷ (83 + 1) = 84MHz ÷ 84 = 1MHz  （即计数器每 1μs 递增 1 次，因为 1MHz = 1μs / 计数） 
	//总计数次数 = 19999 + 1 = 20000 次
	//定时周期 = 20000 × 1μs = 20000μs = 20ms
	TIM_TimeBaseInitStruct.TIM_Period=19999;//重装载值 周期=20ms 84MHz是定时器时钟源频率 （20000个计数周期）
	TIM_TimeBaseInitStruct.TIM_Prescaler=84-1;//预分频系数

	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse=1500;
	
	TIM_OC1Init(TIM3, &TIM_OCInitStruct);	
	TIM_OC2Init(TIM3, &TIM_OCInitStruct);	
	TIM_OC3Init(TIM3, &TIM_OCInitStruct);	
	TIM_OC4Init(TIM3, &TIM_OCInitStruct);

	//使能TIM3的4个通道PWM输出（关键：单独使能每个通道）
	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

	//使能TIM3自动重装载预装载（确保周期和脉宽更新生效）
    TIM_ARRPreloadConfig(TIM3, ENABLE);

	TIM_Cmd(TIM3, ENABLE);//使能定时器
	
}

void Set_SG90_Angle(uint8_t ch,uint8_t angle)//pulse:500-2500
{
	uint16_t pulse;
	if(angle>180) angle=180;//限制最大角度
	if(angle<0) angle=0;//限制最小角度
	
	pulse=500+(uint32_t)(2000*angle)/180;

	//限制脉宽范围（防止舵机损坏）
	if(pulse<500) pulse=500;
	if(pulse>2500) pulse=2500;

	switch(ch){
		case 1:
			TIM_SetCompare1(TIM3, pulse); // 设置PWM脉宽
			break;
		case 2:
			TIM_SetCompare2(TIM3, pulse); // 设置PWM脉宽
			break;
		case 3:
			TIM_SetCompare3(TIM3, pulse); // 设置PWM脉宽
			break;
		case 4:
			TIM_SetCompare4(TIM3, pulse); // 设置PWM脉宽
			break;
		default:
			break;
	}
}
